package top.lyjwn.ajui;

import android.app.Application;
import android.content.Context;

import com.alibaba.fastjson.JSONObject;
import com.xuexiang.xui.XUI;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.WebSocket;
import top.lyjwn.ajui.data.SenderMessage;
import top.lyjwn.ajui.listener.IWebSocketListener;
import top.lyjwn.ajui.network.HttpUtil;
import top.lyjwn.ajui.network.IWebSocketClient;
import top.lyjwn.ajui.test.IMppt;
import top.lyjwn.ajui.test.UserUtil;
import top.lyjwn.ajui.util.LogUtil;
import top.lyjwn.ajui.util.UrlUtil;

public class AJUIApplication extends Application {

    private static Context context;

    private static IWebSocketClient webSocketClient;

    private static OkHttpClient okHttpClient;

    public static WebSocket chatWebSocket;

    private final static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);


    @Override
    public void onCreate() {
        super.onCreate();
        XUI.init(this); //初始化UI框架
        XUI.debug(false);  //开启UI框架调试日志
        //设置默认字体为华文行楷，这里写你的字体库
//        XUI.getInstance().initFontStyle("fonts/hwxk.ttf");
        setContext(getApplicationContext());
        if (UserUtil.getUser()!=null) {
            Request.Builder builder = HttpUtil.getBuilder(UrlUtil.WSHOST);
            Request request = builder.build();
            AJUIApplication.setChatWebSocket(AJUIApplication.getOkHttpClient().newWebSocket(request, new IWebSocketListener(getContext())));
        }
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    if (chatWebSocket!=null){
                        SenderMessage senderMessage = new SenderMessage(3);
                        chatWebSocket.send(JSONObject.toJSONString(senderMessage));
                    }
                }catch (Exception e){
                    LogUtil.e("webSocket ping Exception",e.getMessage(),e);
                }

            }
        }, 10, 15, TimeUnit.SECONDS);
    }

    public static Context getContext() {
        return context;
    }

    public static void setContext(Context context) {
        AJUIApplication.context = context;
    }

    public static IWebSocketClient getWebSocketClient() {
        return webSocketClient;
    }

    public static void setWebSocketClient(IWebSocketClient webSocketClient) {
        AJUIApplication.webSocketClient = webSocketClient;
    }

    public synchronized static OkHttpClient getOkHttpClient() {
        if (okHttpClient==null){
            okHttpClient = new OkHttpClient.Builder().pingInterval(10, TimeUnit.SECONDS).build();
        }
        return okHttpClient;
    }

    public static void setOkHttpClient(OkHttpClient okHttpClient) {
        AJUIApplication.okHttpClient = okHttpClient;
    }

    public static WebSocket getChatWebSocket() {
        return chatWebSocket;
    }

    public static void setChatWebSocket(WebSocket chatWebSocket) {
        AJUIApplication.chatWebSocket = chatWebSocket;
    }

    public static  void setIMppt(Request request,IMppt iMppt){
        AJUIApplication.setChatWebSocket(AJUIApplication.getOkHttpClient().newWebSocket(request, iMppt));
    }


    public static void mpptSend(String message){
        chatWebSocket.send(message);
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        switch (level) {
            case TRIM_MEMORY_UI_HIDDEN:
                //表示应用程序的所有UI界面被隐藏了，即用户点击了Home键或者Back键导致应用的UI界面不可见．这时候应该释放一些资源
//                XToast.normal(getApplicationContext(),"建议您在内存中锁定应用程序来更好的接收消息").show();
                break;
            case TRIM_MEMORY_RUNNING_MODERATE:
                //表示应用程序正常运行，并且不会被杀掉。但是目前手机的内存已经有点低了，系统可能会开始根据LRU缓存规则来去杀死进程了
                break;
            case TRIM_MEMORY_RUNNING_LOW:
                //表示应用程序正常运行，并且不会被杀掉。但是目前手机的内存已经非常低了，我们应该去释放掉一些不必要的资源以提升系统的性能，同时这也会直接影响到我们应用程序的性能。
                break;
            case TRIM_MEMORY_RUNNING_CRITICAL:
                //表示应用程序仍然正常运行，但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源，不然的话系统可能会继续杀掉所有缓存中的进程，并且开始杀掉一些本来应当保持运行的进程，比如说后台运行的服务。
                break;
            case TRIM_MEMORY_BACKGROUND:
                //示手机目前内存已经很低了，系统准备开始根据LRU缓存来清理进程。这个时候我们的程序在LRU缓存列表的最近位置，是不太可能被清理掉的，但这时去释放掉一些比较容易恢复的资源能够让手机的内存变得比较充足，从而让我们的程序更长时间地保留在缓存当中，这样当用户返回我们的程序时会感觉非常顺畅，而不是经历了一次重新启动的过程。
                break;
            case TRIM_MEMORY_MODERATE:
                //示手机目前内存已经很低了，并且我们的程序处于LRU缓存列表的中间位置，如果手机内存还得不到进一步释放的话，那么我们的程序就有被系统杀掉的风险了。
                android.os.Process.killProcess(android.os.Process.myPid());
                break;
            case TRIM_MEMORY_COMPLETE:
                //表示手机目前内存已经很低了，并且我们的程序处于LRU缓存列表的最边缘位置，系统会最优先考虑杀掉我们的应用程序，在这个时候应当尽可能地把一切可以释放的东西都进行释放。
                break;
        }
    }
}
